package com.server.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.entity.StudentTable;
import com.entity.TTreeNodeReq;
import com.entity.TeacherTable;
import com.mapper.db1.StudentTableMapper;
import com.server.IStudentTableService;
import com.server.ITTreeNodeService;
import com.server.ITeacherTableService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import java.util.Date;

/**
 * <p>
 *  服务实现类
 * </p>
 *
 * @author chl
 * @since 2021-12-18
 */
@Service
public class StudentTableServiceImpl extends ServiceImpl<StudentTableMapper, StudentTable> implements IStudentTableService {


    @Autowired
    private ITTreeNodeService treeNodeService;
    /**
     * 测试Spring事务传播性 （注意不同数据源则失效，只对同一数据源起事务回滚作用）
     * @see Propagation#REQUIRED (默认事务) -- 上下文存在事务就加入事务，不存在则新建事务
     *          外、子方法都加上，同一事务异常回滚；不加也是默认事务
     * @see Propagation#REQUIRES_NEW -- 上下文不管是否存在事务，都会新建一个新的事务
     *          外REQUIRED事务，子REQUIRES_NEW，子方法会单独建立一个事务，子方法异常会导致外方法回滚，外方法异常不会影响内方法正常提交事务
     *          外REQUIRED_NEW事务，子REQUIRES_NEW, 同上
     * @see Propagation#SUPPORTS -- 如果上下文已存在事务，则加入该事务，如果不存在，就不开启新的事务，以非事务的方式执行。
     * @see Propagation#NOT_SUPPORTED -- 就是当前方法不能在事务里执行，如果上下文存在了事务，就先把这个事务挂起，当前方法以非事务方式执行，执行完后再继续这个事务。
     * @see Propagation#MANDATORY -- 如果上下文已存在事务，则加入该事务，如果不存在，就抛出异常，即必须在事务的环境下运行。
     * @see Propagation#NEVER -- 如果上下文已存在事务，则抛出异常。如果没有则以非事务的方式执行。即不能在事务的环境下运行。
     * @see Propagation#NESTED -- 如果执行某方法时上下文已存在事务，则加入这个事务，但是会在执行方法前先创建一个回滚点（savepoint），
     *                              如果这个方法失败则回滚到回滚点，成功后继续执行事务，如果此时出现异常，则事务全部回滚。
     *                              如果上下文不存在事务，则开启一个新事务。
     * @Author chl
     * @Description T573
     * @Date 16:11 2023/10/25
     * @param tTreeNode tTreeNode
     * @return response response
     **/
    @Override
    @Transactional(rollbackFor = Exception.class,propagation = Propagation.REQUIRES_NEW)
    public Boolean add(StudentTable tTreeNode) {
        StudentTable node = new StudentTable();
        node.setStudentName("学生1号");
        node.setCreateTime(new Date());
        boolean save = save(node);

        String treeId = node.getId();
        System.out.println("生成ID为:" + treeId);

        // 获取数字ID
//        long id = IdWorker.getId();
        // 获取字符串ID
//        String idStr = IdWorker.getIdStr();

        // 事务传播性，新增老师
        treeNodeService.add(new TTreeNodeReq());

//        int a = 1 / 0;
        return save;

    }



}
